package com.yami.shop.common.util;

import com.yami.shop.common.exception.YamiShopBindException;
import org.springframework.web.multipart.MultipartFile;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

/**
 * 文件处理工具类
 */
public class FileUtil {

    /**
     * 读取TXT文件内容并按行分割成数组
     *
     * @param file TXT文件
     * @return 字符串数组，每个元素对应文件中的一行
     * @throws YamiShopBindException 如果文件为空、不是TXT文件或读取过程中出错
     */
    public static String[] readTxtFileLines(MultipartFile file) {
        validateTxtFile(file);
        
        List<String> lines = new ArrayList<>();
        
        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(file.getInputStream(), StandardCharsets.UTF_8))) {
            
            String line;
            while ((line = reader.readLine()) != null) {
                // 添加非空行
                if (!line.trim().isEmpty()) {
                    lines.add(line);
                }
            }
            
        } catch (IOException e) {
            throw new YamiShopBindException("读取文件失败: " + e.getMessage());
        }
        
        return lines.toArray(new String[0]);
    }
    
    /**
     * 读取TXT文件内容并按行分割成数组，可以指定是否跳过第一行（通常是标题行）
     *
     * @param file TXT文件
     * @param skipFirstLine 是否跳过第一行
     * @return 字符串数组，每个元素对应文件中的一行
     * @throws YamiShopBindException 如果文件为空、不是TXT文件或读取过程中出错
     */
    public static String[] readTxtFileLines(MultipartFile file, boolean skipFirstLine) {
        validateTxtFile(file);
        
        List<String> lines = new ArrayList<>();
        
        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(file.getInputStream(), StandardCharsets.UTF_8))) {
            
            // 如果需要跳过第一行，则先读取一行
            if (skipFirstLine) {
                reader.readLine();
            }
            
            String line;
            while ((line = reader.readLine()) != null) {
                // 添加非空行
                if (!line.trim().isEmpty()) {
                    lines.add(line);
                }
            }
            
        } catch (IOException e) {
            throw new YamiShopBindException("读取文件失败: " + e.getMessage());
        }
        
        return lines.toArray(new String[0]);
    }
    
    /**
     * 读取TXT文件内容并按行分割成列表
     *
     * @param file TXT文件
     * @return 字符串列表，每个元素对应文件中的一行
     * @throws YamiShopBindException 如果文件为空、不是TXT文件或读取过程中出错
     */
    public static List<String> readTxtFileLinesList(MultipartFile file) {
        validateTxtFile(file);
        
        List<String> lines = new ArrayList<>();
        
        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(file.getInputStream(), StandardCharsets.UTF_8))) {
            
            String line;
            while ((line = reader.readLine()) != null) {
                // 添加非空行
                if (!line.trim().isEmpty()) {
                    lines.add(line);
                }
            }
            
        } catch (IOException e) {
            throw new YamiShopBindException("读取文件失败: " + e.getMessage());
        }
        
        return lines;
    }
    
    /**
     * 读取TXT文件内容并按行分割成列表，可以指定是否跳过第一行（通常是标题行）
     *
     * @param file TXT文件
     * @param skipFirstLine 是否跳过第一行
     * @return 字符串列表，每个元素对应文件中的一行
     * @throws YamiShopBindException 如果文件为空、不是TXT文件或读取过程中出错
     */
    public static List<String> readTxtFileLinesList(MultipartFile file, boolean skipFirstLine) {
        validateTxtFile(file);
        
        List<String> lines = new ArrayList<>();
        
        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(file.getInputStream(), StandardCharsets.UTF_8))) {
            
            // 如果需要跳过第一行，则先读取一行
            if (skipFirstLine) {
                reader.readLine();
            }
            
            String line;
            while ((line = reader.readLine()) != null) {
                // 添加非空行
                if (!line.trim().isEmpty()) {
                    lines.add(line);
                }
            }
            
        } catch (IOException e) {
            throw new YamiShopBindException("读取文件失败: " + e.getMessage());
        }
        
        return lines;
    }
    
    /**
     * 验证文件是否为有效的TXT文件
     *
     * @param file 要验证的文件
     * @throws YamiShopBindException 如果文件为空或不是TXT文件
     */
    private static void validateTxtFile(MultipartFile file) {
        if (file == null || file.isEmpty()) {
            throw new YamiShopBindException("文件不能为空");
        }
        
        String fileName = file.getOriginalFilename();
        if (fileName == null || !fileName.toLowerCase().endsWith(".txt")) {
            throw new YamiShopBindException("只支持TXT文件格式");
        }
    }
} 